<?php

/**
 * Data Access for Canciones table
 *
 * @author janunezc
 */
require_once ("DataAccessHelper.php");
require_once ("BE/BECancion.php");

class DA_Canciones {

    public static function guardarCancion($cancion) {
        if ($cancion->cancion_id == 0 || $cancion->cancion_id == '--Nuevo--') {/* INSERT */
            $sqlCmd = " INSERT INTO canciones (titulo, introduccion, cancion_y_notas,creditos,dur_min,intro_dur_sec,actualizacion_por)
                        VALUES ('$cancion->titulo',
                                '$cancion->introduccion',
                                '$cancion->cancion_y_notas',
                                '$cancion->creditos',
                                $cancion->dur_min,
                                $cancion->intro_dur_sec,
                                '$cancion->actualizacion_por'
                                )
                        ";
        } else {/* UPDATE */

            $sqlCmd = " UPDATE canciones
                        SET titulo = '$cancion->titulo',
                            introduccion = '$cancion->introduccion',
                            cancion_y_notas = '$cancion->cancion_y_notas',
                            creditos='$cancion->creditos',
                            dur_min='$cancion->dur_min',
                            intro_dur_sec=$cancion->intro_dur_sec,
                            actualizacion_por = '$cancion->actualizacion_por'
                        WHERE cancion_id = $cancion->cancion_id";
        }

        DataAccessHelper::executeSQL($sqlCmd);
        DA_Canciones::crearRegistrodeAuditoria($cancion);

        if ($cancion->cancion_id == 0 || $cancion->cancion_id == '--Nuevo--') {/* NEW RECORD */
            $cancion = DA_Canciones::obtenerCancionPorTitulo($cancion->titulo);
        }
        return $cancion;
    }

    /**
     *
     * @param BECancion $cancion
     * @return void
     */
    public static function crearRegistrodeAuditoria($cancion) {
        if ($cancion->cancion_id > 0 && $cancion->cancion_id != '--Nuevo--') {
            $sqlCmd_Audit = "   INSERT INTO audit_canciones (operacion,cancion_id,titulo, introduccion, cancion_y_notas,creditos,dur_min,intro_dur_sec,actualizacion_por)
                                VALUES ('U',
                                        $cancion->cancion_id,
                                        '$cancion->titulo',
                                        '$cancion->introduccion',
                                        '$cancion->cancion_y_notas',
                                        '$cancion->creditos',
                                        $cancion->dur_min,
                                        $cancion->intro_dur_sec,
                                        '$cancion->actualizacion_por'
                                        )
                                ";
        } else {
            $cancion = DA_Canciones::obtenerCancionPorTitulo($cancion->titulo);
            $sqlCmd_Audit = "   INSERT INTO audit_canciones (operacion,cancion_id,titulo, introduccion, cancion_y_notas,creditos,dur_min,intro_dur_sec,actualizacion_por)
                                VALUES ('I',
                                        $cancion->cancion_id,
                                        '$cancion->titulo',
                                        '$cancion->introduccion',
                                        '$cancion->cancion_y_notas',
                                        '$cancion->creditos',
                                        $cancion->dur_min,
                                        $cancion->intro_dur_sec,
                                        '$cancion->actualizacion_por'
                                        )
                                ";
        }

        DataAccessHelper::executeSQL($sqlCmd_Audit);
    }

    /*     * *
     *
     */

    public static function buscarTitulosDeCanciones($q) {
        if ($q == '')
            return;
        //SEPARATE QUERY INTO WORDS
        $words = explode(" ", $q);

        //BUILD WHERE CRITERIA
        $sqlCompare_titulo = "";
        $sqlCompare_cancion = "";
        $firstTime = TRUE;
        foreach ($words as $word) {
            if ($firstTime) {
                $sqlCompare_titulo.="c.titulo like '%$word%'";
                $firstTime = FALSE;
            } else {
                $sqlCompare_titulo.="AND c.titulo like '%$word%'";
            }
        }

        $firstTime = TRUE;
        foreach ($words as $word) {
            if ($firstTime) {
                $sqlCompare_cancion.="cancion_y_notas like '%$word%'";
                $firstTime = FALSE;
            } else {
                $sqlCompare_cancion.="AND cancion_y_notas like '%$word%'";
            }
        }

        //BUILD SQL COMMAND
        $SQLCommand = "  SELECT c.cancion_id,
                         c.titulo,
                         max(r.fecha) as fecha_repertorio
                         FROM canciones c
                         left outer join repertorios_canciones rc on rc.cancion_id = c.cancion_id
                         left outer join repertorios r on r.repertorio_id = rc.repertorio_id                         
                         WHERE ($sqlCompare_titulo) OR ($sqlCompare_cancion)
                         group by c.cancion_id, c.titulo
                         ORDER BY titulo
            ";

        $queryResult = DataAccessHelper::executeSQL($SQLCommand);
        $canciones = null;

        if ($queryResult) {
            while ($row = mysql_fetch_row($queryResult)) {
                $canciones[$row[0]] = $row[1] . "($row[2])";
            }
        }
        return $canciones;
    }
    
    public static function buscarTitulosDeCanciones_Momento($q) {
        if ($q == '')
            return;
        

        //BUILD SQL COMMAND
        $SQLCommand = "  SELECT c.cancion_id,
                         c.titulo,
                         max(r.fecha) as fecha_repertorio
                         FROM canciones c
                         inner join canciones_momentos cm on cm.cancion_id = c.cancion_id
                         inner join momentos m on m.momento_id = cm.momento_id AND m.momento_nm = '$q'
                         left outer join repertorios_canciones rc on rc.cancion_id = c.cancion_id
                         left outer join repertorios r on r.repertorio_id = rc.repertorio_id         
                         group by c.cancion_id, c.titulo
                         ORDER BY titulo";

        $queryResult = DataAccessHelper::executeSQL($SQLCommand);
        $canciones = null;

        if ($queryResult) {
            while ($row = mysql_fetch_row($queryResult)) {
                $canciones[$row[0]] = $row[1] . "($row[2])";
            }
        }
        return $canciones;
    }

    public static function buscarTitulosDeCanciones_Liturgia($q) {
        if ($q == '')
            return;
        

        //BUILD SQL COMMAND
        $SQLCommand = "  SELECT c.cancion_id,
                         c.titulo,
                         max(r.fecha) as fecha_repertorio
                         FROM canciones c
                         inner join canciones_tiempos_liturgicos ctl on ctl.cancion_id = c.cancion_id
                         inner join tiempos_liturgicos tl on tl.tiempo_liturgico_id = ctl.tiempo_liturgico_id AND tl.tiempo_liturgico_nombre = '$q'
                         left outer join repertorios_canciones rc on rc.cancion_id = c.cancion_id
                         left outer join repertorios r on r.repertorio_id = rc.repertorio_id         
                         group by c.cancion_id, c.titulo
                         ORDER BY titulo";

        $queryResult = DataAccessHelper::executeSQL($SQLCommand);
        $canciones = null;

        if ($queryResult) {
            while ($row = mysql_fetch_row($queryResult)) {
                $canciones[$row[0]] = $row[1] . "($row[2])";
            }
        }
        return $canciones;
    }
    
    public static function obtenerCancionPorTitulo($titulo) {
        $sqlCmd = "
            SELECT  cancion_id,
                    titulo,
                    introduccion,
                    cancion_y_notas,
                    creditos,
                    dur_min,
                    intro_dur_sec,
                    actualizacion_fecha,
                    actualizacion_por
        FROM canciones WHERE titulo = '$titulo'";
        $result = DataAccessHelper::executeSQL($sqlCmd);
        if ($result) {
            $row = mysql_fetch_row($result);

            $cancion = DA_Canciones::fillBECancion($row);
        }

        return $cancion;
    }

    public static function obtenerCancion($id) {
        $sqlCmd = "
            SELECT  cancion_id,
                    titulo,
                    introduccion,
                    cancion_y_notas,
                    creditos,
                    dur_min,
                    intro_dur_sec,
                    actualizacion_fecha,
                    actualizacion_por
        FROM canciones WHERE cancion_id = $id";
        $result = DataAccessHelper::executeSQL($sqlCmd);
        if ($result) {
            $row = mysql_fetch_row($result);

            $cancion = DA_Canciones::fillBECancion($row);
        }

        return $cancion;
    }

    /**
     * Recibe una cancion (BECancion) y devuelve el texto correspondiente a la letra de la canción sin notas.
     * @param <type> $cancion_y_notas
     * @return <type> 
     */
    public static function obtenerSoloLetra($cancion_y_notas) {
        $lineas = explode("\n", $cancion_y_notas);
        ////split("\n",$cancion_y_notas);

        $resultado = "";
        foreach ($lineas as $linea) {
            if (trim($linea == ""))
                continue;
            $tipoDeLinea = DA_Canciones::determinarTipoDeLinea($linea);
            switch ($tipoDeLinea) {
                case "LETRA":
                    $lineaAUsar = "$linea\n";
                    $lineaAUsar = preg_replace('/ +/', ' ',$lineaAUsar);
                    $resultado.=$lineaAUsar;
                    break;
                default://SIMPLEMENTE SE DESCARTAN LAS LINEAS DE TIPO DIFERENTE A LETRA
            }
        }
        return $resultado;
    }

    /**
     * Determina el tipo de Linea para la linea suministrada:
     *  - INSTRUCCION
     *  - ACORDE
     *  - LETRA
     * @param <type> $linea 
     * @return <type> String
     */
    private static function determinarTipoDeLinea($linea) {
        $linea_sin_espacios = trim($linea);
        if(DA_Canciones::contains($linea_sin_espacios, '----')){
            return "LETRA";
        }
        
        if (DA_Canciones::contains($linea_sin_espacios, '<') || DA_Canciones::contains($linea_sin_espacios, '-')) {
            return "INSTRUCCIONES";
        }

        $palabras = explode(" ", $linea);
        $cuenta_acordes = 0;
        $cuenta_letras = 0;
        foreach ($palabras as $palabra) {
            if (trim($palabra) == "")
                continue;
            if (DA_Canciones::hayTrazosDeAcordes($palabra)) {
                $cuenta_acordes++;
            } else {
                $cuenta_letras++;
            }
        }

        if ($cuenta_acordes > $cuenta_letras) {
            return "ACORDES";
        } else {
            return "LETRA";
        }
    }

    private static function hayTrazosDeAcordes($palabra) {
        $posibleAcorde = substr($palabra, 0, 4);
        if (DA_Canciones::contains($posibleAcorde, 'DO'))
            return TRUE;
        if (DA_Canciones::contains($posibleAcorde, 'RE'))
            return TRUE;
        if (DA_Canciones::contains($posibleAcorde, 'MI'))
            return TRUE;
        if (DA_Canciones::contains($posibleAcorde, 'FA'))
            return TRUE;
        if (DA_Canciones::contains($posibleAcorde, 'SOL'))
            return TRUE;
        if (DA_Canciones::contains($posibleAcorde, 'LA'))
            return TRUE;
        if (DA_Canciones::contains($posibleAcorde, 'SI'))
            return TRUE;
        return FALSE;
    }

    private static function contains($string_to_look_at, $string_to_look_for) {
        $string_to_look_at = strtolower($string_to_look_at);
        $string_to_look_for = strtolower($string_to_look_for);
        $compare = strpos($string_to_look_at, $string_to_look_for);
        if ($compare === FALSE) {
            return FALSE;
        } else {
            return TRUE;
        }
    }

    private static function fillBECancion($row) {
        $cancion = new BECancion();
        $cancion->cancion_id = $row[0];
        $cancion->titulo = $row[1];
        $cancion->introduccion = $row[2];
        $cancion->cancion_y_notas = $row[3];
        $cancion->creditos = $row[4];
        $cancion->dur_min = $row[5];
        $cancion->intro_dur_sec = $row[6];
        $cancion->actualizacion_fecha = $row[7];
        $cancion->actualizacion_por = $row[8];

        return $cancion;
    }

}

?>
